package com.wdshine.ui;

import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class GameJFrame extends JFrame implements KeyListener, ActionListener {
    // GameJFrame为游戏的主窗体

    // 创建JMenuItem
    // 绑定事件时需要用，所以在类中定义
    JMenuItem restartItem = new JMenuItem("重新开始");
    JMenuItem reLoginItem = new JMenuItem("重新登陆");
    JMenuItem closeItem = new JMenuItem("退出游戏");
    JMenuItem myInfo = new JMenuItem("大头贴");

    JMenuItem jx3Image = new JMenuItem("剑网3");
    JMenuItem animalImage = new JMenuItem("动物");
    JMenuItem sportImage = new JMenuItem("运动");
    JMenuItem girlImage = new JMenuItem("人物");

    // 管理图片顺序的数组
    int[][] data = new int[4][4];

    // 数组中 0 的位置
    int zeroX = 0, zeroY = 0;

    // 正确顺序数组
    int[][] win = new int[][] {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12},
        {13, 14, 15, 0}
    };

    String imagePath = "image\\jx\\jx3\\";

    static List<String> pathList = new ArrayList<>();

    // 初始化图片路径List
    static {
        pathList.add("image\\jx\\jx");
        pathList.add("image\\animal\\animal");
        pathList.add("image\\sport\\sport");
        pathList.add("image\\girl\\girl");
    }

    // 每种类型的图片数量
    int[] imageNum = new int[] {
        4, 8, 10, 13
    };

    // 计步
    int steps = 0;

    public GameJFrame() {
        // 设置界面
        initJFrame();

        // 设置菜单
        initJMenuBar();

        // 初始化数据
        initData();

        // 初始化图片
        initImage();

        // 显示窗口
        this.setVisible(true);
    }

    // 初始化界面
    private void initJFrame() {
        // 设置界面宽高
        this.setSize(603, 680);
        // 设置界面标题
        this.setTitle("拼图游戏 v1.0");
        // 设置界面置顶
        this.setAlwaysOnTop(true);
        // 界面居中
        this.setLocationRelativeTo(null);
        // 关闭模式
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // 关闭默认居中模式
        this.setLayout(null);

        // 添加事件
        this.addKeyListener(this);
    }

    // 初始化菜单
    private void initJMenuBar() {
        // 初始化菜单
        // 创建菜单对象JMenuBar
        JMenuBar menuBar = new JMenuBar();

        // 创建JMenu
        JMenu functionMenu = new JMenu("功能");
        JMenu aboutMenu = new JMenu("关于");
        JMenu changeImageMenu = new JMenu("更换图片");

        // 绑定事件
        restartItem.addActionListener(this);
        reLoginItem.addActionListener(this);
        closeItem.addActionListener(this);
        myInfo.addActionListener(this);

        girlImage.addActionListener(this);
        animalImage.addActionListener(this);
        sportImage.addActionListener(this);
        jx3Image.addActionListener(this);

        // 菜单嵌套
        functionMenu.add(changeImageMenu);

        changeImageMenu.add(jx3Image);
        changeImageMenu.add(animalImage);
        changeImageMenu.add(sportImage);
        changeImageMenu.add(girlImage);

        functionMenu.add(restartItem);
        functionMenu.add(reLoginItem);
        functionMenu.add(closeItem);

        aboutMenu.add(myInfo);

        menuBar.add(functionMenu);
        menuBar.add(aboutMenu);

        // 设置界面菜单
        this.setJMenuBar(menuBar);
    }

    // 初始化数据
    private void initData(){
        // 定义初始数组
        int[] tempArr = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};

        // 打乱顺序
        Random rand = new Random();
        for (int i = 0; i < tempArr.length; i++){
            int index = rand.nextInt(tempArr.length);
            int temp = tempArr[i];
            tempArr[i] = tempArr[index];
            tempArr[index] = temp;
        }

        for (int i = 0; i < tempArr.length; i++){
            data[i / 4][i % 4] = tempArr[i];
        }
    }

    // 绘制图片
    private void initImage() {
        // 清除原有图片
        this.getContentPane().removeAll();

        // 显示胜利
        if (victory()){
            JLabel winLabel = new JLabel(new ImageIcon("image/win.png"));
            winLabel.setBounds(203, 283, 197, 73);
            this.getContentPane().add(winLabel);
        }

        // 显示步数
        JLabel stepCount = new JLabel("步数：" + steps);
        stepCount.setBounds(50, 30, 100, 20);
        this.getContentPane().add(stepCount);

        // 每行图片
        for (int i = 0; i < 4; i++){
            // 每列图片
            for (int j = 0; j < 4; j++){
                int num = data[i][j];

                // 记录 0 的位置
                if (num == 0){
                    zeroX = i;
                    zeroY = j;
                }

                // 创建图片ImageIcon对象、创建JLabel对象（管理容器）
                JLabel jLabel = new JLabel(new ImageIcon(imagePath + num + ".jpg"));
                // 设置图片位置
                jLabel.setBounds(105 * j + 83, 105 * i + 134, 105, 105);
                // 添加图片边框
                jLabel.setBorder(new BevelBorder(BevelBorder.LOWERED));
                // 把管理容器添加到界面
                this.getContentPane().add(jLabel);
            }
        }

        // 背景图片
        // 创建图片ImageIcon对象、创建JLabel对象（管理容器）
        JLabel jLabel = new JLabel(new ImageIcon("image\\background.png"));
        // 设置图片位置
        jLabel.setBounds(40, 40, 508, 560);
        // 把管理容器添加到界面
        this.getContentPane().add(jLabel);

        // 重绘界面
        this.getContentPane().repaint();
    }

    // 判断是否胜利
    public boolean victory() {
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                if (data[i][j] != win[i][j]) {
                    return false;
                }
            }
        }

        return true;
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {
        if (victory()){
            return;
        }

        int code = e.getKeyCode();
        if (code == 32){
            // 清除原有图片
            this.getContentPane().removeAll();

            // 创建图片ImageIcon对象、创建JLabel对象（管理容器）
            JLabel jLabel = new JLabel(new ImageIcon(imagePath + "all.jpg"));
            // 设置图片位置
            jLabel.setBounds(83, 134, 420, 420);
            // 添加图片边框
            jLabel.setBorder(new BevelBorder(BevelBorder.LOWERED));
            // 把管理容器添加到界面
            this.getContentPane().add(jLabel);

            // 创建图片ImageIcon对象、创建JLabel对象（管理容器）
            JLabel jLabel2 = new JLabel(new ImageIcon("image\\background.png"));
            // 设置图片位置
            jLabel2.setBounds(40, 40, 508, 560);
            // 把管理容器添加到界面
            this.getContentPane().add(jLabel2);

            this.getContentPane().repaint();
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {
        if (victory()){
            return;
        }

        int code = e.getKeyCode();
        // 左：37，上：38，右：39，下：40，空格：32

        // System.out.println(code);

        // 移动数组
        if (code == 38) {
            // 上移
            if (zeroX == 3){
                return;
            }

            // 步数加 1
            steps++;

            data[zeroX][zeroY] = data[zeroX + 1][zeroY];
            data[zeroX + 1][zeroY] = 0;
            zeroX++;

            // 刷新图片
            initImage();
        } else if (code == 37) {
            // 左移

            if (zeroY == 3){
                return;
            }

            // 步数加 1
            steps++;

            data[zeroX][zeroY] = data[zeroX][zeroY + 1];
            data[zeroX][zeroY + 1] = 0;
            zeroY++;

            // 刷新图片
            initImage();
        } else if (code == 40) {
            // 下移
            if (zeroX == 0){
                return;
            }

            // 步数加 1
            steps++;

            data[zeroX][zeroY] = data[zeroX - 1][zeroY];
            data[zeroX - 1][zeroY] = 0;
            zeroX--;

            // 刷新图片
            initImage();
        } else if (code == 39) {
            // 右移
            if (zeroY == 0){
                return;
            }

            // 步数加 1
            steps++;

            data[zeroX][zeroY] = data[zeroX][zeroY - 1];
            data[zeroX][zeroY - 1] = 0;
            zeroY--;

            // 刷新图片
            initImage();
        } else if (code == 32) {
            initImage();
        } else if (code == 87) {
            data = new int[][] {
                    {1, 2, 3, 4},
                    {5, 6, 7, 8},
                    {9, 10, 11, 12},
                    {13, 14, 15, 0}
            };

            initImage();
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        // 获取当前点击的条目对象
        Object source = e.getSource();

        if (source == restartItem){
            // 清零计数器
            steps = 0;
            // 打乱数据
            initData();
            // 加载图片
            initImage();

        } else if (source == reLoginItem){
            // 关闭当前界面
            this.setVisible(false);
            // 打开登录界面
            new LoginJFrame();

        } else if (source == closeItem){
            // 关闭虚拟机
            System.exit(0);
        } else if (source == myInfo){
            // 弹框对象
            JDialog jDialog = new JDialog();
            jDialog.setTitle("果冻豆");
            // 容器
            JLabel jLabel = new JLabel(new ImageIcon("image/about.png"));
            jLabel.setBounds(0, 0, 258, 258);
            jDialog.getContentPane().add(jLabel);
            // 弹窗大小
            jDialog.setSize(344, 344);
            jDialog.setResizable(false);
            // 弹窗置顶
            jDialog.setAlwaysOnTop(true);
            // 弹窗居中
            jDialog.setLocationRelativeTo(null);
            // 屏蔽游戏窗口操作
            jDialog.setModal(true);
            // 显示弹窗
            jDialog.setVisible(true);
        } else if (source == jx3Image) {
            Random r = new Random();
            imagePath = pathList.get(0) + (r.nextInt(imageNum[0]) + 1) + "\\";

            // 清零计数器
            steps = 0;
            // 打乱数据
            initData();
            // 加载图片
            initImage();
        } else if (source == animalImage) {
            Random r = new Random();
            imagePath = pathList.get(1) + (r.nextInt(imageNum[1]) + 1) + "\\";

            // 清零计数器
            steps = 0;
            // 打乱数据
            initData();
            // 加载图片
            initImage();
        } else if (source == sportImage) {
            Random r = new Random();
            imagePath = pathList.get(2) + (r.nextInt(imageNum[2]) + 1) + "\\";

            // 清零计数器
            steps = 0;
            // 打乱数据
            initData();
            // 加载图片
            initImage();
        } else if (source == girlImage) {
            Random r = new Random();
            imagePath = pathList.get(3) + (r.nextInt(imageNum[3]) + 1) + "\\";

            // 清零计数器
            steps = 0;
            // 打乱数据
            initData();
            // 加载图片
            initImage();
        }

        System.out.println(imagePath);
    }
}
